"""UptimeRobot sensor platform."""

from __future__ import annotations

from homeassistant.components.sensor import (
    SensorDeviceClass,
    SensorEntity,
    SensorEntityDescription,
)
from homeassistant.const import EntityCategory
from homeassistant.core import HomeAssistant
from homeassistant.helpers.entity_platform import AddConfigEntryEntitiesCallback

from .coordinator import UptimeRobotConfigEntry
from .entity import UptimeRobotEntity

SENSORS_INFO = {
    0: "pause",
    1: "not_checked_yet",
    2: "up",
    8: "seems_down",
    9: "down",
}

# Coordinator is used to centralize the data updates
PARALLEL_UPDATES = 0


async def async_setup_entry(
    hass: HomeAssistant,
    entry: UptimeRobotConfigEntry,
    async_add_entities: AddConfigEntryEntitiesCallback,
) -> None:
    """Set up the UptimeRobot sensors."""
    coordinator = entry.runtime_data

    known_devices: set[int] = set()

    def _check_device() -> None:
        current_devices = {monitor.id for monitor in coordinator.data}
        new_devices = current_devices - known_devices
        if new_devices:
            known_devices.update(new_devices)
            async_add_entities(
                UptimeRobotSensor(
                    coordinator,
                    SensorEntityDescription(
                        key=str(monitor.id),
                        entity_category=EntityCategory.DIAGNOSTIC,
                        device_class=SensorDeviceClass.ENUM,
                        options=[
                            "down",
                            "not_checked_yet",
                            "pause",
                            "seems_down",
                            "up",
                        ],
                        translation_key="monitor_status",
                    ),
                    monitor=monitor,
                )
                for monitor in coordinator.data
                if monitor.id in new_devices
            )

    _check_device()
    entry.async_on_unload(coordinator.async_add_listener(_check_device))


class UptimeRobotSensor(UptimeRobotEntity, SensorEntity):
    """Representation of a UptimeRobot sensor."""

    @property
    def native_value(self) -> str:
        """Return the status of the monitor."""
        return SENSORS_INFO[self.monitor.status]
